import { getToken, setToken, removeToken } from '@/utils/auth.js'
import { loginAPI, getUserInfoAPI, getUserPhotoAPI } from '@/api'
import { resetRouter } from '@/router'
const getDefaultState = () => {
  return {
    token: getToken(), // 获取用户token,如果本地没有token,则为'',如果本地有token,则使用token
    userInfo: {}
  }
}

const state = getDefaultState()

const mutations = {
  // 重置vuex数据
  // Object.assign() 是把第二个参数往后的所有对象的key+value,复制到第一个参数的对象上
  // getDefaultState() 调用后,将上面默认初始的state对象(空值),赋值给现有的第一个参数state对象中重新覆盖值
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  // 存入token
  SET_TOKEN: (state, newToken) => {
    state.token = newToken
    setToken(newToken) // 将token存入本地cookie
  },
  // 删除token
  REMOVE_TOKEN: (state) => {
    state.token = ''
    removeToken() // 删除本地token
  },
  // 存入用户信息到vuex
  SET_USER: (state, value) => {
    state.userInfo = value
  },
  // 删除用户信息
  REMOVE_USER: (state) => {
    state.userInfo = {}
  }
}

const actions = {
  // 登录逻辑
  async loginActions({ commit }, value) {
    const [err, res] = await loginAPI(value)
    if (!err) commit('SET_TOKEN', res.data)
    return [err, res]
  },
  // 获取用户信息
  async getUserInfoActions({ commit }) {
    const res = await getUserInfoAPI()
    const user = await getUserPhotoAPI(res.data.userId)
    // 保存用户信息
    commit('SET_USER', { ...res.data, ...user.data }) // 将res.data和user.data中的key+value合并成一个对象,赋值给userInfo属性中
  },
  // 退出登录
  async logOutActions({ commit }) {
    commit('app/RESET_ASYNCROUTE', null, { root: true }) // 在一个模块中调用另一个模块中的dispatch,要加root:true, 清空之前的动态路由规则数组
    commit('RESET_STATE')
    commit('REMOVE_USER')
    commit('REMOVE_TOKEN')
    resetRouter() // 重置路由,解决登录闪烁和白屏
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

